
///////////////////////////////////////////////////////////////////////////////
//
//  Copyright (c) 2007, Arizona State University
//  All rights reserved.
//  BSD License: http://www.opensource.org/licenses/bsd-license.html
//  Author: Perry L Miller IV
//
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////
//
//  Base visitor class.
//
///////////////////////////////////////////////////////////////////////////////

#include "Minerva/Core/Visitor.h"
#include "Minerva/Core/TileEngine/Body.h"
#include "Minerva/Core/Data/Container.h"

#include "Usul/Cast/Cast.h"
#include "Usul/Functions/SafeCall.h"

#include "boost/bind.hpp"

using namespace Minerva::Core;

MINERVA_IMPLEMENT_VISITOR_CLASS ( Visitor );


///////////////////////////////////////////////////////////////////////////////
//
//  Constructor
//
///////////////////////////////////////////////////////////////////////////////

Visitor::Visitor() : BaseClass()
{
}


///////////////////////////////////////////////////////////////////////////////
//
//  Destructor
//
///////////////////////////////////////////////////////////////////////////////

Visitor::~Visitor()
{
  Usul::Functions::safeCall ( boost::bind ( &Visitor::_destroy, this ), "2197133630" );
}


///////////////////////////////////////////////////////////////////////////////
//
//  Destroy
//
///////////////////////////////////////////////////////////////////////////////

void Visitor::_destroy()
{
}


///////////////////////////////////////////////////////////////////////////////
//
//  Visit the feature.
//
///////////////////////////////////////////////////////////////////////////////

void Visitor::visit ( Minerva::Core::Data::Feature &feature )
{
}


///////////////////////////////////////////////////////////////////////////////
//
//  Visit the data object.
//
///////////////////////////////////////////////////////////////////////////////

void Visitor::visit ( Minerva::Core::Data::DataObject &dataObject )
{
  this->visit ( USUL_UNSAFE_CAST ( Feature&, dataObject ) );
}


///////////////////////////////////////////////////////////////////////////////
//
//  Visit the vector layer.
//
///////////////////////////////////////////////////////////////////////////////

void Visitor::visit ( Minerva::Core::Data::Container& vector )
{
  vector.traverse ( *this );
}


///////////////////////////////////////////////////////////////////////////////
//
//  Visit the node.
//
///////////////////////////////////////////////////////////////////////////////

void Visitor::visit ( Minerva::Core::TileEngine::Body & body )
{
  // Get body compoents.
  Minerva::Core::Data::Container::RefPtr vector ( body.vectorData() );
  Minerva::Core::Data::Container::RefPtr raster ( body.rasterData() );
  Minerva::Core::Data::Container::RefPtr elevation ( body.elevationData() );
  
  if ( vector.valid() )
    vector->accept ( *this );
  
  if ( raster.valid() )
    raster->accept ( *this );
  
  if ( elevation.valid() )
    elevation->accept ( *this );
}


///////////////////////////////////////////////////////////////////////////////
//
//  Visit the raster layer.
//
///////////////////////////////////////////////////////////////////////////////

void Visitor::visit ( Minerva::Core::Layers::RasterLayer &rasterLayer )
{
  this->visit ( USUL_UNSAFE_CAST ( Feature&, rasterLayer ) );
}
